<!DOCTYPE html>
<!-- BBF GitHub Pages pandoc template; modified from default.html template -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
  <meta charset="utf-8"/>
  <meta name="generator" content="pandoc"/>
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
  <meta name="author" content=""/>
  <meta name="description" content="Broadband Forum User Services
Platform (USP) Data Models: Device Data Model Files and Documentation"/>
  <meta name="theme-color" content="#157878"/>
  <title>BBF – Broadband Forum User Services Platform (USP) Data Models</title>
  <style>
    code{white-space: pre-wrap;}
    span.smallcaps{font-variant: small-caps;}
    div.columns{display: flex; gap: min(4vw, 1.5em);}
    div.column{flex: auto; overflow-x: auto;}
    div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
    /* The extra [class] is a hack that increases specificity enough to
       override a similar rule in reveal.js */
    ul.task-list[class]{list-style: none;}
    ul.task-list li input[type="checkbox"] {
      font-size: inherit;
      width: 0.8em;
      margin: 0 0.8em 0.2em -1.6em;
      vertical-align: middle;
    }
    .display.math{display: block; text-align: center; margin: 0.5rem auto;}
  </style>
  <link rel="stylesheet" href="github.css"/>
  <link rel="stylesheet" href="extra.css"/>
  <link rel="stylesheet" href="local.css"/>
  <!-- Automatic hover links scripts -->
  <script>
  window.addEventListener('DOMContentLoaded', function() {
    var hoverlink = null;

    var elems = document.querySelectorAll('.auto-hoverlink:not(section)');
      for (var i = 0; i < elems.length; i++) {
        var elem = elems[i];

        elem.addEventListener('mouseenter', event => {
          var target = event.target;
          var info_attr = target.attributes.getNamedItem('data-info');
          var anchor_attr = target.attributes.getNamedItem('data-anchor');
          var thing = info_attr ? info_attr.value : target.localName
          /* we check the parent to cover the case where pandoc has moved the
             id from a header to its parent section */
          var anchor = target.id || target.parentElement.id ||
                                    (anchor_attr ? anchor_attr.value : null);

          if (hoverlink) {
            hoverlink.remove();
            hoverlink = null;
          }

          if (!anchor) {
              console.warn('%s %s has no id or data-anchor',
                           thing, target.textContent);
          } else {
            hoverlink = document.createElement('a');
            hoverlink.href = '#' + anchor;
            hoverlink.className = 'hoverlink';
            hoverlink.title = 'Permalink to this ' + thing;
            target.appendChild(hoverlink);
          }
        });

        elem.addEventListener('mouseleave', () => {
          if (hoverlink) {
            setTimeout(function(href) {
              if (hoverlink && hoverlink.href == href) {
                hoverlink.remove();
                hoverlink = null;
              }
            }, 1000, hoverlink.href);
          }
        });
      }
  });
  </script>
  <!-- Automatic hover links styles -->
  <style>
  :root {
      --hoverlink-gap: 0.2em;
      --hoverlink-size: 0.9em;
  }

  .hoverlink {
      text-decoration: none;
  }

  .hoverlink::after {
      position: absolute;
      display: inline-block;
      content: "";
      margin-left: var(--hoverlink-gap);
      width: var(--hoverlink-size);
      height: var(--hoverlink-size);
      background-size: var(--hoverlink-size) var(--hoverlink-size);
      /* https://icon-library.com/images/permalink-icon/permalink-icon-17.jpg
         (resized from 512x512 to 64x64) */
      background-image: url(permalink.png);
  }
  </style>
  <!-- Automatic sections scripts -->
  <script>
  /* 1. Find all sections, i.e., elements with class "new-section"
     2. If a section has no id (shouldn't happen), auto-assign one
     3. For each element with an id, set "data-section" to its section id
     4. For each internal link, similarly set "data-section" to its section id
   */
  window.addEventListener('DOMContentLoaded', () => {
      var target_sections = new Map();
      var sections = document.getElementsByClassName('new-section');
      for (var i = 0; i < sections.length; i++) {
          var section = sections[i];
          if (!section.id) {
              section.id = 'section-' + i;
          }
          target_sections.set(section.id, section.id);
          section.setAttribute('data-section', section.id)
          var targets = section.querySelectorAll('[id]');
          for (var j = 0; j < targets.length; j++) {
              var target = targets[j];
              target_sections.set(target.id, section.id);
              target.setAttribute('data-section', section.id)
          }
      }

      var doc_url = new URL(document.URL);
      var links = document.querySelectorAll('a[href]');
      var warned = new Map()
      for (var i = 0; i < links.length; i++) {
          var link = links[i];
          var url = new URL(link.href, document.URL);
          if (url.hostname == doc_url.hostname &&
              url.pathname == doc_url.pathname && url.hash) {
              var href = url.hash.substring(1);
              var section_id = target_sections.get(href)
              if (!section_id) {
                  if (!warned.get(href)) {
                      console.warn("href %s undefined or not within a section",
                                   href);
                      warned.set(href, true);
                  }
              } else {
                  link.setAttribute('data-section', section_id);
              }
          }
      }
  });

  /* Create a new scope to avoid using a global variable */
  (function() {

      /* Show the section with the given id, which is assumed to be valid */
      function show_section(section_id) {
          var section = document.getElementById(section_id);

          /* The "cover-only" class indicates elements that should only be
             shown when the cover page section is shown */
          var cover_onlys = document.getElementsByClassName('cover-only');
          if (section) {
              for (var i = 0; i < cover_onlys.length; i++) {
                  var cover_only = cover_onlys[i];
                  if (section_id != 'sec:cover-page') {
                      cover_only.classList.add('hidden')
                  } else {
                      cover_only.classList.remove('hidden')
                  }
              }
          }

          /* Hide all sections, then un-hide this one */
          var sections = document.getElementsByClassName('new-section');
          for (var i = 0; i < sections.length; i++) {
              sections[i].classList.add('hidden');
          }
          section.classList.remove('hidden')
      }

      /* Add click events to all links, using the "data-section" attribute
         (set earlier) to show the associated section */
      window.addEventListener('DOMContentLoaded', () => {
          var links = document.querySelectorAll('a[data-section]');
          for (var i = 0; i < links.length; i++) {
              links[i].addEventListener('click', event => {
                  var link = event.currentTarget;
                  var section_id = link.attributes['data-section'].value;
                  show_section(section_id);
              });
          }
      });

      /* Ensure that loading the page with a URL fragment (hash) will show the
         associated section */
      window.addEventListener('DOMContentLoaded', () => {
          var url = new URL(document.URL);
          if (url.hash.length > 1) {
              var href = url.hash.substring(1);
              var target = document.getElementById(href);
              if (!target) {
                  var fallback = 'sec:executive-summary';
                  console.warn("target %s undefined; falling back on %s",
                               href, fallback);
                  href = fallback;
                  target = document.getElementById(href);
                  if (!target) {
                      var fallback = 'sec:cover-page';
                      console.warn("target %s undefined; falling back on %s",
                                   href, fallback);
                      href = fallback;
                      target = document.getElementById(href);
                  }
              }
              if (!target) {
                  console.warn("target %s undefined", href);
              } else {
                  var section_id = target.attributes['data-section'].value;
                  if (!section_id) {
                      console.warn("target %s not within a section", href);
                  } else {
                      show_section(section_id);
                  }
              }
          }
      });

  /* End of new scope */
  })();
  </script>
  <!-- Automatic sections styles -->
  <style>
  h1.cover-page, .hidden, aside.footnotes-end-of-document {
      display: none;
  }
  </style>
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>

<body>
  <section class="page-header">
    <h1 class="project-name">
      <a href="index.html" style="text-decoration: none; color: white;">
        <img src="bbflogo-reverse-dark.png"/><br>
        The User Services Platform
      </a>
    </h1>
    <h2 class="project-tagline">Device Data Model Files and
Documentation</h2>
    <p></p>
    <p></p>
    <div class="project-buttons">
      <a class="btn" href="index.html#sec:current-data-models">Current
Data Models</a>
      <a class="btn" href="https://data-model-template.broadband-forum.org" title="TR-106">Data
Model Template</a>
      <a class="btn" href="https://usp.technology" title="usp.technology">Home</a>
    </div>
  </section>

  <section class="main-content">
    <header id="title-block-header" class="cover-only">
      <h1 class="title auto-hoverlink" id="title">Broadband Forum User
Services Platform (USP) Data Models</h1>
      <p class="author"></p>
    </header>
<section id="sec:cover-page" class="cover-page unnumbered new-section">
<h1 class="cover-page unnumbered">Introduction</h1>
<p><strong>Page not found :(</strong></p>
<p>The requested page could not be found.</p>
<p>All Broadband Forum data model filenames are of the form
<code>tr-&lt;number&gt;-&lt;issue&gt;-&lt;amendment&gt;-&lt;corrigendum&gt;.&lt;extension&gt;</code>.</p>
<p>You might have been looking for a file without all three (issue,
amendment, corrigendum) version qualifiers, e.g.,
<code>tr-181-2-13.xml</code> as opposed to
<code>tr-181-2-13-0.xml</code>.</p>
</section>
<section id="footnotes" class="footnotes footnotes-end-of-document"
role="doc-endnotes">
<hr />
<ol>
<li id="fn1"><p>Early versions of the CWMP data model defined two root
data models, <em>InternetGatewayDevice</em> and <em>Device</em>. Version
2 of the <em>Device</em> root data model (<em>Device:2</em>) deprecates
<em>InternetGatewayDevice</em> and <em>Device:1</em> in favor of a
single root data model.<a href="#fnref1" class="footnote-back"
role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
    <div style="clear: both;"></div>
    <footer class="site-footer">
      <span class="site-footer-owner">
        USP is developed and maintained
        by <a href="https://www.broadband-forum.org">The Broadband Forum</a>.
        &copy; The Broadband Forum 2024</a>. All Rights Reserved.
      </span>
      <span class="site-footer-credits">
        This page was generated by <a href="https://pandoc.org">pandoc</a>
        and <a href="https://pages.github.com">GitHub Pages</a>.
        View the <a href="https://github.com/BroadbandForum/cwmp-data-models">specification
source on GitHub</a>.
        <span class="release"></span>
      </span>
    </footer>
  </section>
</body>
</html>
